'use strict';
class CryptoUtil {
    static KEY_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    static SALT_LENGTH = 16;
    static PRIVATE_KEY = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n" +
        "nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==";

    static base64UrlEncode(str) {
        return Buffer.from(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
            function toSolidBytes(match, p1) {
                return String.fromCharCode(Number('0x' + p1));
            }))
            .toString('base64')
            .replace(/\+/g, '-')
            .replace(/\//g, '_')
            .replace(/=+$/, '');
    }

    static base64UrlDecode(str) {
        str = str.replace(/-/g, '+').replace(/_/g, '/');
        while (str.length % 4) {
            str += '=';
        }
        const decoded = Buffer.from(str, 'base64').toString();
        return decodeURIComponent(decoded.split('').map(function(c) {
            return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
        }).join(''));
    }

    static encrypt(data, key) {
        let result = '';
        for (let i = 0; i < data.length; i++) {
            result += String.fromCharCode(data.charCodeAt(i) ^ key.charCodeAt(i % key.length));
        }
        return this.base64UrlEncode(result);
    }

    static decrypt(encryptedData, key) {
        try {
            const data = this.base64UrlDecode(encryptedData);
            let result = '';
            for (let i = 0; i < data.length; i++) {
                result += String.fromCharCode(data.charCodeAt(i) ^ key.charCodeAt(i % key.length));
            }
            return result;
        } catch (error) {
            console.error('Decrypt Error:', error);
            throw error;
        }
    }

    static decryptRequest(encryptedData, salt) {
        try {
            const decrypted = this.decrypt(encryptedData, this.PRIVATE_KEY + salt);
            return JSON.parse(decrypted);
        } catch (error) {
            console.error('Parse Request Error:', error);
            throw error;
        }
    }

    static encryptResponse(data, salt) {
        const jsonStr = JSON.stringify(data);
        return this.encrypt(jsonStr, this.PRIVATE_KEY + salt);
    }
}

module.exports = {
	/**
	 * 配置
	 * @url client/pub/getConfig 前端调用的url参数地址
	 * data 请求参数
	 * @param {String} params1  参数1
	 */
	main: async (event) => {
		let { data = {}, userInfo, util, filterResponse, originalParam } = event;
		let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
		let { uid } = data;
		let res = { code: 0, msg: "" };
		// 业务逻辑开始-----------------------------------------------------------
		let headers = originalParam.event.headers;
		if(!headers){
			res.code = -1
			res.msg = "参数错误"
			return res
		}
		let systemPrompt = `# 角色
你是“重生之路”游戏的智能系统，负责带领玩家体验这个充满挑战与机遇的互动式文字游戏。


## 技能
### 技能 1: 初始化游戏
1. 引导玩家选择重生方向（历史/人文/科技/农业等），选择随机的话任意选择一个方向。
2. 时代背景范围为中国石器时代到70年代之间的任意一个时代
3. 根据玩家选择设定初始属性和背景故事，并告知玩家当前时代背景和初始状态。
===回复示例===
   - 重生方向：<玩家选择的方向>
   - 初始属性：<根据方向设定的属性，如健康、智力等>
   - 背景故事：<与方向相关的简短故事>
   - 时代背景：<重生所在时代及时代描述>
   - 初始状态：<玩家在游戏开始时的情况>
   - 下一步发展问题：<列出下一步发展问题>
   - 选择项：<列出可供玩家选择的选项，选项以1、2、3、4、5等阿拉伯序号来排序，最后一项支持开放式回答>
===示例结束===

### 技能 2: 推进回合
1. 以回合制进行游戏，每个回合代表一个重要人生阶段或关键决策点。
2. 描述当前情境和玩家状态。
3. 提供多个选择选项或开放式问答。
4. 根据玩家的选择/回答动态调整剧情走向及时间跨度，并更新玩家状态数据。
5. 每回合要结合时间段进行推进，每回合都要有时间过度
===回复示例===
   - 当前情境：<详细描述当前时间点、场景和情况>
   - 玩家状态：<健康、智力、财富等属性状态>
   - 剧情调整：<根据玩家选择，描述剧情的变化以及当前剧情消耗的时间，时间预估要合理>
   - 状态更新：<更新后的玩家属性和状态>
   - 下一步发展问题：<列出下一步发展问题>
   - 选择项：<列出可供玩家选择的选项，选项以1、2、3、4、5来排序，也可以开放式回答>
===示例结束===

### 技能 3: 触发随机事件
1. 在合适时机随机触发特殊事件，事件类型包括历史大事件、个人机遇、危机与挑战、人际关系变动。
2. 确保事件的影响符合历史背景和现实逻辑。
===回复示例===
   - 事件类型：<具体的事件年份、类型>
   - 事件描述：<详细描述事件内容>
   - 影响分析：<分析事件对玩家的影响>
===示例结束===

### 技能 4: 时间推进周期
1. 每回合选择合适的推进周期，可以是几周、几个月、几年。
2. 确保事件的进度不至于太缓慢，每个里程碑要在5回合内完成。


### 技能 5: 追踪玩家状态
1. 持续追踪并更新玩家的基本属性（健康、智力、财富等）、已获得的技能和知识、社交关系网络、重要成就和里程碑、当前所处年代和社会地位。
===回复示例===
   - 基本属性：<列出当前的健康、智力、财富等属性值>
   - 技能知识：<列出已获得的技能和知识>
   - 社交关系：<描述当前的社交关系网络>
   - 成就里程碑：<列出重要成就和里程碑>
   - 年代地位：<当前所处年份、年代和社会地位描述>
===示例结束===

### 技能 6: 处理游戏结局
1. 在玩家主动选择结束、触发死亡条件、达成特定成就（如长生、财富自由等）或达到合理的人生终点时触发游戏结局。
2. 向玩家展示游戏总结和最终状态。
===回复示例===
   - 结局原因：<说明触发结局的原因>
   - 游戏总结：<对整个游戏过程进行简要总结并且给于玩家生平进行评价>
   - 最终状态：<玩家在游戏结束时的状态>
===示例结束===

## 限制:
- 只专注于“重生之路”游戏的运营，拒绝回答与游戏无关的话题。
- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求。
		`;
		let claudeConfig = {
			"apiKey": "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",
			"model": "claude-3-sonnet-20241022",
			"baseUrl": "https://api.anthropic.com/v1/messages",
			"systemPrompt": systemPrompt,
			"maxTokens": 4096,
			"temperature": 0.7
		}
		let salt = headers["X-Salt"];
	
		res.data = claudeConfig
		
		console.log("返回参数", res)
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	}
}
